home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 25 / Cream of the Crop 25.iso / doom / axxwar_1.zip / SOURCES / MISC.QC < prev    next >
Text File  |  1997-02-25  |  16KB  |  675 lines

  1. // AxxWars 0.8
  2.  
  3. /*QUAKED info_null (0 0.5 0) (-4 -4 -4) (4 4 4)
  4. Used as a positional target for spotlights, etc.
  5. */
  6. void() info_null =
  7. {
  8.     remove(self);
  9. };
  10.  
  11. /*QUAKED info_notnull (0 0.5 0) (-4 -4 -4) (4 4 4)
  12. Used as a positional target for lightning.
  13. */
  14. void() info_notnull =
  15. {
  16. };
  17.  
  18. //============================================================================
  19.  
  20. float START_OFF = 1;
  21.  
  22. void() light_use =
  23. {
  24.     if (self.spawnflags & START_OFF)
  25.     {
  26.         lightstyle(self.style, "m");
  27.         self.spawnflags = self.spawnflags - START_OFF;
  28.     }
  29.     else
  30.     {
  31.         lightstyle(self.style, "a");
  32.         self.spawnflags = self.spawnflags + START_OFF;
  33.     }
  34. };
  35.  
  36. /*QUAKED light (0 1 0) (-8 -8 -8) (8 8 8) START_OFF
  37. Non-displayed light.
  38. Default light value is 300
  39. Default style is 0
  40. If targeted, it will toggle between on or off.
  41. */
  42. void() light =
  43. {
  44.     if (!self.targetname)
  45.     {    // inert light
  46.         remove(self);
  47.         return;
  48.     }
  49.     
  50.     if (self.style >= 32)
  51.     {
  52.         self.use = light_use;
  53.         if (self.spawnflags & START_OFF)
  54.             lightstyle(self.style, "a");
  55.         else
  56.             lightstyle(self.style, "m");
  57.     }
  58. };
  59.  
  60. /*QUAKED light_fluoro (0 1 0) (-8 -8 -8) (8 8 8) START_OFF
  61. Non-displayed light.
  62. Default light value is 300
  63. Default style is 0
  64. If targeted, it will toggle between on or off.
  65. Makes steady fluorescent humming sound
  66. */
  67. void() light_fluoro =
  68. {
  69.     if (self.style >= 32)
  70.     {
  71.         self.use = light_use;
  72.         if (self.spawnflags & START_OFF)
  73.             lightstyle(self.style, "a");
  74.         else
  75.             lightstyle(self.style, "m");
  76.     }
  77.     
  78.     precache_sound ("ambience/fl_hum1.wav");
  79.     ambientsound (self.origin, "ambience/fl_hum1.wav", 0.5, ATTN_STATIC);
  80. };
  81.  
  82. /*QUAKED light_fluorospark (0 1 0) (-8 -8 -8) (8 8 8)
  83. Non-displayed light.
  84. Default light value is 300
  85. Default style is 10
  86. Makes sparking, broken fluorescent sound
  87. */
  88. void() light_fluorospark =
  89. {
  90.     if (!self.style)
  91.         self.style = 10;
  92.  
  93.     precache_sound ("ambience/buzz1.wav");
  94.     ambientsound (self.origin, "ambience/buzz1.wav", 0.5, ATTN_STATIC);
  95. };
  96.  
  97. /*QUAKED light_globe (0 1 0) (-8 -8 -8) (8 8 8)
  98. Sphere globe light.
  99. Default light value is 300
  100. Default style is 0
  101. */
  102. void() light_globe =
  103. {
  104.     precache_model ("progs/s_light.spr");
  105.     setmodel (self, "progs/s_light.spr");
  106.     makestatic (self);
  107. };
  108.  
  109. void() FireAmbient =
  110. {
  111.     precache_sound ("ambience/fire1.wav");
  112. // attenuate fast
  113.     ambientsound (self.origin, "ambience/fire1.wav", 0.5, ATTN_STATIC);
  114. };
  115.  
  116. /*QUAKED light_torch_small_walltorch (0 .5 0) (-10 -10 -20) (10 10 20)
  117. Short wall torch
  118. Default light value is 200
  119. Default style is 0
  120. */
  121. void() light_torch_small_walltorch =
  122. {
  123.     precache_model ("progs/flame.mdl");
  124.     setmodel (self, "progs/flame.mdl");
  125.     FireAmbient ();
  126.     makestatic (self);
  127. };
  128.  
  129. /*QUAKED light_flame_large_yellow (0 1 0) (-10 -10 -12) (12 12 18)
  130. Large yellow flame ball
  131. */
  132. void() light_flame_large_yellow =
  133. {
  134.     precache_model ("progs/flame2.mdl");
  135.     setmodel (self, "progs/flame2.mdl");
  136.     self.frame = 1;
  137.     FireAmbient ();
  138.     makestatic (self);
  139. };
  140.  
  141. /*QUAKED light_flame_small_yellow (0 1 0) (-8 -8 -8) (8 8 8) START_OFF
  142. Small yellow flame ball
  143. */
  144. void() light_flame_small_yellow =
  145. {
  146.     precache_model ("progs/flame2.mdl");
  147.     setmodel (self, "progs/flame2.mdl");
  148.     FireAmbient ();
  149.     makestatic (self);
  150. };
  151.  
  152. /*QUAKED light_flame_small_white (0 1 0) (-10 -10 -40) (10 10 40) START_OFF
  153. Small white flame ball
  154. */
  155. void() light_flame_small_white =
  156. {
  157.     precache_model ("progs/flame2.mdl");
  158.     setmodel (self, "progs/flame2.mdl");
  159.     FireAmbient ();
  160.     makestatic (self);
  161. };
  162.  
  163. //============================================================================
  164.  
  165.  
  166. /*QUAKED misc_fireball (0 .5 .8) (-8 -8 -8) (8 8 8)
  167. Lava Balls
  168. */
  169.  
  170. void() fire_fly;
  171. void() fire_touch;
  172. void() misc_fireball =
  173. {
  174.     
  175.     precache_model ("progs/lavaball.mdl");
  176.     self.classname = "fireball";
  177.     self.nextthink = time + (random() * 5);
  178.     self.think = fire_fly;
  179.     if (!self.speed)
  180.         self.speed == 1000;
  181. };
  182.  
  183. void() fire_fly =
  184. {
  185. local entity    fireball;
  186.  
  187.     fireball = spawn();
  188.     fireball.solid = SOLID_TRIGGER;
  189.     fireball.movetype = MOVETYPE_TOSS;
  190.     fireball.velocity = '0 0 1000';
  191.     fireball.velocity_x = (random() * 100) - 50;
  192.     fireball.velocity_y = (random() * 100) - 50;
  193.     fireball.velocity_z = self.speed + (random() * 200);
  194.     fireball.classname = "fireball";
  195.     setmodel (fireball, "progs/lavaball.mdl");
  196.     setsize (fireball, '0 0 0', '0 0 0');
  197.     setorigin (fireball, self.origin);
  198.     fireball.nextthink = time + 5;
  199.     fireball.think = SUB_Remove;
  200.     fireball.touch = fire_touch;
  201.     
  202.     self.nextthink = time + (random() * 5) + 3;
  203.     self.think = fire_fly;
  204. };
  205.  
  206.  
  207. void() fire_touch =
  208. {
  209.     T_Damage (other, self, self, 20);
  210.     remove(self);
  211. };
  212.  
  213. //============================================================================
  214.  
  215.  
  216. void() barrel_explode =
  217. {
  218.     self.takedamage = DAMAGE_NO;
  219.     self.classname = "explo_box";
  220.     // did say self.owner
  221.     T_RadiusDamage (self, self, 160, world);
  222.     sound (self, CHAN_VOICE, "weapons/r_exp3.wav", 1, ATTN_NORM);
  223.     particle (self.origin, '0 0 0', 75, 255);
  224.  
  225.     self.origin_z = self.origin_z + 32;
  226.     BecomeExplosion ();
  227. };
  228.  
  229.  
  230.  
  231. /*QUAKED misc_explobox (0 .5 .8) (0 0 0) (32 32 64)
  232. TESTING THING
  233. */
  234.  
  235. void() misc_explobox =
  236. {
  237.     local float    oldz;
  238.     
  239.     self.solid = SOLID_BBOX;
  240.     self.movetype = MOVETYPE_NONE;
  241.     precache_model ("maps/b_explob.bsp");
  242.     setmodel (self, "maps/b_explob.bsp");
  243.     precache_sound ("weapons/r_exp3.wav");
  244.     self.health = 20;
  245.     self.th_die = barrel_explode;
  246.     self.takedamage = DAMAGE_AIM;
  247.  
  248.     self.origin_z = self.origin_z + 2;
  249.     oldz = self.origin_z;
  250.     droptofloor();
  251.     if (oldz - self.origin_z > 250)
  252.     {
  253.         dprint ("item fell out of level at ");
  254.         dprint (vtos(self.origin));
  255.         dprint ("\n");
  256.         remove(self);
  257.     }
  258. };
  259.  
  260.  
  261.  
  262.  
  263. /*QUAKED misc_explobox2 (0 .5 .8) (0 0 0) (32 32 64)
  264. Smaller exploding box, REGISTERED ONLY
  265. */
  266.  
  267. void() misc_explobox2 =
  268. {
  269.     local float    oldz;
  270.     
  271.     self.solid = SOLID_BBOX;
  272.     self.movetype = MOVETYPE_NONE;
  273.     precache_model2 ("maps/b_exbox2.bsp");
  274.     setmodel (self, "maps/b_exbox2.bsp");
  275.     precache_sound ("weapons/r_exp3.wav");
  276.     self.health = 20;
  277.     self.th_die = barrel_explode;
  278.     self.takedamage = DAMAGE_AIM;
  279.  
  280.     self.origin_z = self.origin_z + 2;
  281.     oldz = self.origin_z;
  282.     droptofloor();
  283.     if (oldz - self.origin_z > 250)
  284.     {
  285.         dprint ("item fell out of level at ");
  286.         dprint (vtos(self.origin));
  287.         dprint ("\n");
  288.         remove(self);
  289.     }
  290. };
  291.  
  292. //============================================================================
  293.  
  294. float SPAWNFLAG_SUPERSPIKE    = 1;
  295. float SPAWNFLAG_LASER = 2;
  296.  
  297. void(vector org, vector vec) LaunchLaser;
  298.  
  299. void() spikeshooter_use =
  300. {
  301.     if (self.spawnflags & SPAWNFLAG_LASER)
  302.     {
  303.         sound (self, CHAN_VOICE, "enforcer/enfire.wav", 1, ATTN_NORM);
  304.         LaunchLaser (self.origin, self.movedir);
  305.     }
  306.     else
  307.     {
  308.         sound (self, CHAN_VOICE, "weapons/spike2.wav", 1, ATTN_NORM);
  309.         launch_spike (self.origin, self.movedir);
  310.         newmis.velocity = self.movedir * 500;
  311.         if (self.spawnflags & SPAWNFLAG_SUPERSPIKE)
  312.             newmis.touch = superspike_touch;
  313.     }
  314. };
  315.  
  316. void() shooter_think =
  317. {
  318.     spikeshooter_use ();
  319.     self.nextthink = time + self.wait;
  320.     newmis.velocity = self.movedir * 500;
  321. };
  322.  
  323.  
  324. /*QUAKED trap_spikeshooter (0 .5 .8) (-8 -8 -8) (8 8 8) superspike laser
  325. When triggered, fires a spike in the direction set in QuakeEd.
  326. Laser is only for REGISTERED.
  327. */
  328.  
  329. void() trap_spikeshooter =
  330. {
  331.     SetMovedir ();
  332.     self.use = spikeshooter_use;
  333.     if (self.spawnflags & SPAWNFLAG_LASER)
  334.     {
  335.         precache_model2 ("progs/laser.mdl");
  336.         
  337.         precache_sound2 ("enforcer/enfire.wav");
  338.         precache_sound2 ("enforcer/enfstop.wav");
  339.     }
  340.     else
  341.         precache_sound ("weapons/spike2.wav");
  342. };
  343.  
  344.  
  345. /*QUAKED trap_shooter (0 .5 .8) (-8 -8 -8) (8 8 8) superspike laser
  346. Continuously fires spikes.
  347. "wait" time between spike (1.0 default)
  348. "nextthink" delay before firing first spike, so multiple shooters can be stagered.
  349. */
  350. void() trap_shooter =
  351. {
  352.     trap_spikeshooter ();
  353.     
  354.     if (self.wait == 0)
  355.         self.wait = 1;
  356.     self.nextthink = self.nextthink + self.wait + self.ltime;
  357.     self.think = shooter_think;
  358. };
  359.  
  360.  
  361.  
  362. /*
  363. ===============================================================================
  364.  
  365.  
  366. ===============================================================================
  367. */
  368.  
  369.  
  370. void() make_bubbles;
  371. void() bubble_remove;
  372. void() bubble_bob;
  373.  
  374. /*QUAKED air_bubbles (0 .5 .8) (-8 -8 -8) (8 8 8)
  375.  
  376. testing air bubbles
  377. */
  378.  
  379. void() air_bubbles =
  380.  
  381. {
  382.     if (deathmatch)
  383.     {
  384.         remove (self);
  385.         return;
  386.     }
  387.     precache_model ("progs/s_bubble.spr");
  388.     self.nextthink = time + 1;
  389.     self.think = make_bubbles;
  390. };
  391.  
  392. void() make_bubbles =
  393. {
  394. local entity    bubble;
  395.  
  396.     bubble = spawn();
  397.     setmodel (bubble, "progs/s_bubble.spr");
  398.     setorigin (bubble, self.origin);
  399.     bubble.movetype = MOVETYPE_NOCLIP;
  400.     bubble.solid = SOLID_NOT;
  401.     bubble.velocity = '0 0 15';
  402.     bubble.nextthink = time + 0.5;
  403.     bubble.think = bubble_bob;
  404.     bubble.touch = bubble_remove;
  405.     bubble.classname = "bubble";
  406.     bubble.frame = 0;
  407.     bubble.cnt = 0;
  408.     setsize (bubble, '-8 -8 -8', '8 8 8');
  409.     self.nextthink = time + random() + 0.5;
  410.     self.think = make_bubbles;
  411. };
  412.  
  413. void() bubble_split =
  414. {
  415. local entity    bubble;
  416.     bubble = spawn();
  417.     setmodel (bubble, "progs/s_bubble.spr");
  418.     setorigin (bubble, self.origin);
  419.     bubble.movetype = MOVETYPE_NOCLIP;
  420.     bubble.solid = SOLID_NOT;
  421.     bubble.velocity = self.velocity;
  422.     bubble.nextthink = time + 0.5;
  423.     bubble.think = bubble_bob;
  424.     bubble.touch = bubble_remove;
  425.     bubble.classname = "bubble";
  426.     bubble.frame = 1;
  427.     bubble.cnt = 10;
  428.     setsize (bubble, '-8 -8 -8', '8 8 8');
  429.     self.frame = 1;
  430.     self.cnt = 10;
  431.     if (self.waterlevel != 3)
  432.         remove (self);
  433. };
  434.  
  435. void() bubble_remove =
  436. {
  437.     if (other.classname == self.classname)
  438.     {
  439. //        dprint ("bump");
  440.         return;
  441.     }
  442.     remove(self);
  443. };
  444.  
  445. void() bubble_bob =
  446. {
  447. local float        rnd1, rnd2, rnd3;
  448. local vector    vtmp1, modi;
  449.  
  450.     self.cnt = self.cnt + 1;
  451.  
  452.     if (self.cnt == 4)
  453.         bubble_split();
  454.     if (self.cnt == 20)
  455.         remove(self);
  456.  
  457.     rnd1 = self.velocity_x + (-10 + (random() * 20));
  458.     rnd2 = self.velocity_y + (-10 + (random() * 20));
  459.     rnd3 = self.velocity_z + 10 + random() * 10;
  460.  
  461.     if (rnd1 > 10)
  462.         rnd1 = 5;
  463.     if (rnd1 < -10)
  464.         rnd1 = -5;
  465.         
  466.     if (rnd2 > 10)
  467.         rnd2 = 5;
  468.     if (rnd2 < -10)
  469.         rnd2 = -5;
  470.         
  471.     if (rnd3 < 10)
  472.         rnd3 = 15;
  473.     if (rnd3 > 30)
  474.         rnd3 = 25;
  475.     
  476.     self.velocity_x = rnd1;
  477.     self.velocity_y = rnd2;
  478.     self.velocity_z = rnd3;
  479.         
  480.     self.nextthink = time + 0.5;
  481.     self.think = bubble_bob;
  482. };
  483.  
  484. /*~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>
  485. ~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~*/
  486.  
  487. /*QUAKED viewthing (0 .5 .8) (-8 -8 -8) (8 8 8)
  488.  
  489. Just for the debugging level.  Don't use
  490. */
  491.  
  492. void() viewthing =
  493.  
  494. {
  495.     self.movetype = MOVETYPE_NONE;
  496.     self.solid = SOLID_NOT;
  497.     precache_model ("progs/player.mdl");
  498.     setmodel (self, "progs/player.mdl");
  499. };
  500.  
  501.  
  502. /*
  503. ==============================================================================
  504.  
  505. SIMPLE BMODELS
  506.  
  507. ==============================================================================
  508. */
  509.  
  510. void() func_wall_use =
  511. {    // change to alternate textures
  512.     self.frame = 1 - self.frame;
  513. };
  514.  
  515. /*QUAKED func_wall (0 .5 .8) ?
  516. This is just a solid wall if not inhibitted
  517. */
  518. void() func_wall =
  519. {
  520.     self.angles = '0 0 0';
  521.     self.movetype = MOVETYPE_PUSH;    // so it doesn't get pushed by anything
  522.     self.solid = SOLID_BSP;
  523.     self.use = func_wall_use;
  524.     setmodel (self, self.model);
  525. };
  526.  
  527.  
  528. /*QUAKED func_illusionary (0 .5 .8) ?
  529. A simple entity that looks solid but lets you walk through it.
  530. */
  531. void() func_illusionary =
  532.  
  533. {
  534.     self.angles = '0 0 0';
  535.     self.movetype = MOVETYPE_NONE;
  536.     self.solid = SOLID_NOT;
  537.     setmodel (self, self.model);
  538.     makestatic ();
  539. };
  540.  
  541. /*QUAKED func_episodegate (0 .5 .8) ? E1 E2 E3 E4
  542. This bmodel will appear if the episode has allready been completed, so players can't reenter it.
  543. */
  544. void() func_episodegate =
  545.  
  546. {
  547.     if (!(serverflags & self.spawnflags))
  548.         return;            // can still enter episode
  549.  
  550.     self.angles = '0 0 0';
  551.     self.movetype = MOVETYPE_PUSH;    // so it doesn't get pushed by anything
  552.     self.solid = SOLID_BSP;
  553.     self.use = func_wall_use;
  554.     setmodel (self, self.model);
  555. };
  556.  
  557. /*QUAKED func_bossgate (0 .5 .8) ?
  558. This bmodel appears unless players have all of the episode sigils.
  559. */
  560. void() func_bossgate =
  561.  
  562. {
  563.     if ( (serverflags & 15) == 15)
  564.         return;        // all episodes completed
  565.     self.angles = '0 0 0';
  566.     self.movetype = MOVETYPE_PUSH;    // so it doesn't get pushed by anything
  567.     self.solid = SOLID_BSP;
  568.     self.use = func_wall_use;
  569.     setmodel (self, self.model);
  570. };
  571.  
  572. //============================================================================
  573. /*QUAKED ambient_suck_wind (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  574. */
  575. void() ambient_suck_wind =
  576. {
  577.     precache_sound ("ambience/suck1.wav");
  578.     ambientsound (self.origin, "ambience/suck1.wav", 1, ATTN_STATIC);
  579. };
  580.  
  581. /*QUAKED ambient_drone (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  582. */
  583. void() ambient_drone =
  584. {
  585.     precache_sound ("ambience/drone6.wav");
  586.     ambientsound (self.origin, "ambience/drone6.wav", 0.5, ATTN_STATIC);
  587. };
  588.  
  589. /*QUAKED ambient_flouro_buzz (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  590. */
  591. void() ambient_flouro_buzz =
  592. {
  593.     precache_sound ("ambience/buzz1.wav");
  594.     ambientsound (self.origin, "ambience/buzz1.wav", 1, ATTN_STATIC);
  595. };
  596. /*QUAKED ambient_drip (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  597. */
  598. void() ambient_drip =
  599. {
  600.     precache_sound ("ambience/drip1.wav");
  601.     ambientsound (self.origin, "ambience/drip1.wav", 0.5, ATTN_STATIC);
  602. };
  603. /*QUAKED ambient_comp_hum (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  604. */
  605. void() ambient_comp_hum =
  606. {
  607.     precache_sound ("ambience/comp1.wav");
  608.     ambientsound (self.origin, "ambience/comp1.wav", 1, ATTN_STATIC);
  609. };
  610. /*QUAKED ambient_thunder (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  611. */
  612. void() ambient_thunder =
  613. {
  614.     precache_sound ("ambience/thunder1.wav");
  615.     ambientsound (self.origin, "ambience/thunder1.wav", 0.5, ATTN_STATIC);
  616. };
  617. /*QUAKED ambient_light_buzz (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  618. */
  619. void() ambient_light_buzz =
  620. {
  621.     precache_sound ("ambience/fl_hum1.wav");
  622.     ambientsound (self.origin, "ambience/fl_hum1.wav", 0.5, ATTN_STATIC);
  623. };
  624. /*QUAKED ambient_swamp1 (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  625. */
  626. void() ambient_swamp1 =
  627. {
  628.     precache_sound ("ambience/swamp1.wav");
  629.     ambientsound (self.origin, "ambience/swamp1.wav", 0.5, ATTN_STATIC);
  630. };
  631. /*QUAKED ambient_swamp2 (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  632. */
  633. void() ambient_swamp2 =
  634. {
  635.     precache_sound ("ambience/swamp2.wav");
  636.     ambientsound (self.origin, "ambience/swamp2.wav", 0.5, ATTN_STATIC);
  637. };
  638.  
  639. //============================================================================
  640.  
  641. void() noise_think =
  642. {
  643.     self.nextthink = time + 0.5;
  644.     sound (self, 1, "enforcer/enfire.wav", 1, ATTN_NORM);
  645.     sound (self, 2, "enforcer/enfstop.wav", 1, ATTN_NORM);
  646.     sound (self, 3, "enforcer/sight1.wav", 1, ATTN_NORM);
  647.     sound (self, 4, "enforcer/sight2.wav", 1, ATTN_NORM);
  648.     sound (self, 5, "enforcer/sight3.wav", 1, ATTN_NORM);
  649.     sound (self, 6, "enforcer/sight4.wav", 1, ATTN_NORM);
  650.     sound (self, 7, "enforcer/pain1.wav", 1, ATTN_NORM);
  651. };
  652.  
  653. /*QUAKED misc_noisemaker (1 0.5 0) (-10 -10 -10) (10 10 10)
  654.  
  655. For optimzation testing, starts a lot of sounds.
  656. */
  657.  
  658. void() misc_noisemaker =
  659.  
  660. {
  661.     precache_sound2 ("enforcer/enfire.wav");
  662.     precache_sound2 ("enforcer/enfstop.wav");
  663.     precache_sound2 ("enforcer/sight1.wav");
  664.     precache_sound2 ("enforcer/sight2.wav");
  665.     precache_sound2 ("enforcer/sight3.wav");
  666.     precache_sound2 ("enforcer/sight4.wav");
  667.     precache_sound2 ("enforcer/pain1.wav");
  668.     precache_sound2 ("enforcer/pain2.wav");
  669.     precache_sound2 ("enforcer/death1.wav");
  670.     precache_sound2 ("enforcer/idle1.wav");
  671.  
  672.     self.nextthink = time + 0.1 + random();
  673.     self.think = noise_think;
  674. };
  675.